home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / ddj0897.zip / JAVANMI.ZIP / LittleWalk / tlh / implementation.cpp next >
C/C++ Source or Header  |  1997-01-21  |  4KB  |  190 lines

  1. #include "toolhelp.h"
  2. #include "string.h"
  3. #include <windows.h>
  4. #include <tlhelp32.h>
  5.  
  6. jobject CreateProcessEntry32( JNIEnv * env, LPPROCESSENTRY32 lppe);
  7.  
  8. BOOL SetDWORDField( JNIEnv * env, DWORD field, jobject procEntry32, char *szField);
  9. BOOL SetStringField( JNIEnv * env, char *field, jobject procEntry32, char *szField);
  10.  
  11. BOOL IsValidField(jfieldID jfield, char *szField);
  12. BOOL AddObject (JNIEnv *env, jobject vector, jobject ProcEntry32);
  13.  
  14.  
  15.  
  16. JNIEXPORT jboolean JNICALL Java_ToolHelp_CreateToolhelp32Snapshot
  17.   (JNIEnv *env, jobject, jint, jint process, jobject vector)
  18. {
  19.     HANDLE handle =  CreateToolhelp32Snapshot(
  20.         TH32CS_SNAPPROCESS, 
  21.         process);
  22.  
  23.     BOOL first = TRUE;
  24.     
  25.     jobject ProcEntry32;
  26.     PROCESSENTRY32 ppe;
  27.     do {
  28.         ppe.dwSize = sizeof( PROCESSENTRY32 );
  29.  
  30.         if(first)
  31.         {
  32.             first = FALSE;
  33.             if ( !Process32First( handle, &ppe))
  34.                 return FALSE;
  35.         }
  36.         else
  37.         {
  38.             if ( !Process32Next( handle, &ppe))
  39.                 return FALSE;
  40.         }
  41.         ProcEntry32 = CreateProcessEntry32(env, &ppe);
  42.     }
  43.     while(AddObject(env, vector,ProcEntry32 ) );    
  44.     
  45.     return TRUE;
  46. }
  47.  
  48. BOOL AddObject (JNIEnv *env, 
  49.                 jobject vector, 
  50.                 jobject ProcEntry32)
  51. {
  52.     if(ProcEntry32 == NULL)
  53.         return FALSE;
  54.  
  55.     jmethodID jmAddElement = env->GetMethodID(
  56.         env->GetObjectClass(vector),
  57.         "addElement", 
  58.         "(Ljava/lang/Object;)V");
  59.  
  60.     if(jmAddElement == NULL)
  61.         return FALSE;
  62.  
  63.     env->CallVoidMethod(vector, jmAddElement, ProcEntry32);
  64.     return TRUE;
  65. }
  66.  
  67. jobject CreateProcessEntry32( JNIEnv * env, 
  68.                              LPPROCESSENTRY32 lppe)
  69. {
  70.     
  71.     jclass jcProcEntry32 =  env->FindClass("ProcessEntry32");
  72.     if(jcProcEntry32 == NULL)
  73.         return NULL;
  74.  
  75.     jmethodID jmProcEntry32 = env->GetMethodID(jcProcEntry32,
  76.         "<init>", 
  77.         "()V");
  78.  
  79.     if(jmProcEntry32 == NULL)
  80.         return NULL;
  81.  
  82.       jobject joProcEntry32 = env->NewObject(
  83.         jcProcEntry32,
  84.         jmProcEntry32,
  85.         "");
  86.  
  87.     if(joProcEntry32 == NULL)
  88.         return NULL;
  89.  
  90.     if (!SetDWORDField(env, lppe->cntUsage, 
  91.         joProcEntry32, "cntUsage"))
  92.         return NULL;
  93.  
  94.     if (!SetDWORDField(env, lppe->th32ProcessID, 
  95.         joProcEntry32, "th32ProcessID"))
  96.         return NULL;
  97.  
  98.     if (!SetDWORDField(env, lppe->th32DefaultHeapID, 
  99.         joProcEntry32, "th32DefaultHeapID"))
  100.         return NULL;
  101.  
  102.     if (!SetDWORDField(env, lppe->cntThreads, 
  103.         joProcEntry32, "cntThreads"))
  104.         return NULL;
  105.  
  106.     if (!SetDWORDField(env, lppe->th32ModuleID, 
  107.         joProcEntry32, "th32ModuleID"))
  108.         return NULL;
  109.  
  110.     if (!SetDWORDField(env, lppe->th32ParentProcessID, 
  111.         joProcEntry32, "th32ParentProcessID"))
  112.         return NULL;
  113.  
  114.     if (!SetDWORDField(env, lppe->pcPriClassBase, 
  115.         joProcEntry32, "pcPriClassBase"))
  116.         return NULL;
  117.  
  118.     if (!SetDWORDField(env, lppe->dwFlags, 
  119.         joProcEntry32, "dwFlags"))
  120.         return NULL;
  121.  
  122.     if (!SetStringField(env, lppe->szExeFile, 
  123.         joProcEntry32, "szExeFile"))
  124.         return NULL;
  125.  
  126.     return joProcEntry32;
  127. }
  128.  
  129.  
  130. BOOL SetDWORDField( JNIEnv * env, 
  131.                    DWORD field, 
  132.                    jobject procEntry32,
  133.                    char *szField)
  134. {
  135.     jfieldID jfield =  env->GetFieldID( 
  136.         env->GetObjectClass(procEntry32),
  137.         szField, 
  138.         "I");
  139.     
  140.     if ( !IsValidField(    jfield, szField) )
  141.         return FALSE;
  142.     
  143.     env->SetIntField(procEntry32, 
  144.         jfield, 
  145.         field);
  146.  
  147.     return TRUE;
  148. }
  149.  
  150. BOOL SetStringField( JNIEnv * env, 
  151.                     char *szString, 
  152.                     jobject procEntry32, 
  153.                     char *szField)
  154. {
  155.     jfieldID jfield =  env->GetFieldID( 
  156.         env->GetObjectClass(procEntry32),
  157.         szField, 
  158.         "Ljava/lang/String;");
  159.  
  160.     if ( !IsValidField(    jfield, szField) )
  161.         return FALSE;
  162.  
  163.     jstring  jstringObject = env->NewStringUTF(    
  164.         szString,
  165.         strlen(szString));
  166.  
  167.     env->SetObjectField(
  168.         procEntry32, 
  169.         jfield, 
  170.         jstringObject);
  171.     return TRUE;
  172. }
  173.  
  174. BOOL IsValidField(jfieldID jfield, 
  175.                   char *szField)
  176. {
  177.     if(jfield == NULL)
  178.     {
  179.         OutputDebugString ("Process");
  180.         OutputDebugString (szField);
  181.         OutputDebugString ("\n");
  182.         return FALSE;
  183.     }
  184.     
  185.     return TRUE;
  186. }
  187.  
  188.  
  189.  
  190.